﻿using Microsoft.Extensions.Configuration;
using SqlSugar;
using System.Reflection;

namespace SqlSugarWebApi.DataContext.Context
{
    public class DbContext
    {
        /*
            1、SqlSugarClient 原生模式访问数据库(性能强)
            2、SqlSugarScope 单例模式访问数据库（使用更简单，性能也不错）
            决定用性能更强的SqlSugarClient
        */
        public SqlSugarClient initDbContext(IConfiguration config, string masterConnStr)
        {
            SqlSugarClient dbClient = new SqlSugarClient(new ConnectionConfig()
            {
                //定义数据库类型
                DbType = DbType.SqlServer,
                ConnectionString = config.GetConnectionString(masterConnStr),
                IsAutoCloseConnection = true,//自动关闭连接
                // 用于支持实体类中的 [SugarColumn] 特性
                InitKeyType = InitKeyType.Attribute,
                ConfigureExternalServices = new ConfigureExternalServices
                {
                    //注意:  这儿AOP设置不能少
                    EntityService = (c, p) =>
                    {
                        /***高版C#写法
                         * 支持string?和string，实体字段没有加?代表建表时该字段不能为null
                         * ***/
                        if (p.IsPrimarykey == false && new NullabilityInfoContext().Create(c).WriteState is NullabilityState.Nullable)
                        {
                            p.IsNullable = true;
                        }
                    }
                }
            }, dbClient =>
            {
                dbClient.Aop.OnLogExecuted = (sql, pars) =>
                {
                    //获取原生SQL推荐  性能OK
                    Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));

                    //获取无参数化SQL 对性能有影响，特别大的SQL参数多的，调试使用
                    //Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))
                };
            });
            return dbClient;
        }
    }
}
